
const { ccclass, property } = cc._decorator;
let winSize = cc.winSize;
let GROUPINDEX = 5.5;
@ccclass
/*
    一个简单的render工具,用于静态的精灵DC优化, 
    注意 :Mask遮罩还不能跳过
    //层级结构
    Root
    -in_node
    -out_sprite
 */
class RenderNode extends cc.Component {

    /**
     * 
     * @param out_sprite 输出显示的精灵
     * @param in_node 输入截图的节点
     */
    renderNode(out_sprite: cc.Sprite, in_node: cc.Node) {
        if (!in_node || !out_sprite) {
            cc.warn("参数错误: ", out_sprite, in_node);
            return;
        }
        //节点未被激活
        if (!in_node.activeInHierarchy) {
            return;
        }

        //初始化
        out_sprite.spriteFrame = null;
        let boundingBox = in_node.getBoundingBox();
        if (!boundingBox.width || !boundingBox.height) {
            //没有面积,不做截取
            cc.warn("没有面积")
            return;
        }
        //渲染前激活节点
        in_node.active = true;

        //暂存groupIndex  用完后恢复
        let oldGI = in_node.groupIndex;
        //给一个不同的值 防止透明区域截到其他组节点的数据
        in_node.groupIndex = GROUPINDEX;//小数不会和其他组冲突

        //新建一个 RenderTexture，
        //并且设置 camera 的 targetTexture 为新建的 RenderTexture，
        //这样 camera 的内容将会渲染到新建的 RenderTexture 中。


        let camera = in_node.addComponent(cc.Camera);
        //摄像机显示的内容
        camera.cullingMask = in_node._cullingMask; //Mark:此处可能和其他节点会有冲突,如果使用了分组,请将GROUPINDEX值设置大些;
        //缩放比值
        let scale = winSize.height / boundingBox.height
        camera.zoomRatio = scale;
        //渲染的纹理
        let texture = new cc.RenderTexture();
        let spriteFrame = new cc.SpriteFrame();
        spriteFrame.setTexture(texture)
        //显示到精灵上
        out_sprite.spriteFrame = spriteFrame;
        //手动反向
        out_sprite.node.scaleY = -1;

        //开始渲染
        let gl = cc.game._renderContext;
        texture.initWithSize(boundingBox.width, boundingBox.height, gl.STENCIL_INDEX8);

        //渲染一次摄像机，即更新一次内容到 RenderTexture 中
        camera.targetTexture = texture;
        camera.render(undefined);

        //渲染完成,删除摄像机
        in_node.removeComponent(cc.Camera)
        texture = null;
        //隐藏传入的节点
        in_node.groupIndex = oldGI;
        in_node.active = false;

    }

}
export default new RenderNode();